package com.pond.pond.service;

import com.pond.common.core.web.domain.AjaxResult;
import com.pond.pond.domain.PondOrder;
import com.pond.pond.domain.dto.CreateOrderRequest;
import com.pond.pond.domain.dto.OrderQueryRequest;
import com.pond.pond.domain.vo.OrderVO;

import java.util.List;

/**
 * 订单服务接口
 */
public interface IPondOrderService {
    
    /**
     * 创建订单（情况1：预约签到后自动创建）
     * @param appointmentSegmentId 预约时间段ID
     * @return 订单信息
     */
    AjaxResult createOrderFromAppointment(Long appointmentSegmentId);
    
    /**
     * 创建订单（情况2：管理员直接创建）
     * @param request 创建订单请求
     * @return 订单信息
     */
    AjaxResult createOrderDirect(CreateOrderRequest request);
    
    /**
     * 查询订单列表
     * @param query 查询条件
     * @return 订单列表
     */
    List<OrderVO> selectOrderList(OrderQueryRequest query);
    
    /**
     * 根据ID查询订单详情
     * @param id 订单ID
     * @return 订单详情
     */
    OrderVO selectOrderById(Long id);
    
    /**
     * 根据订单编号查询订单
     * @param orderNo 订单编号
     * @return 订单信息
     */
    PondOrder selectByOrderNo(String orderNo);
    
    /**
     * 更新订单状态
     * @param id 订单ID
     * @param status 新状态
     * @return 更新结果
     */
    AjaxResult updateOrderStatus(Long id, Integer status);
    
    /**
     * 完成订单
     * @param id 订单ID
     * @return 完成结果
     */
    AjaxResult completeOrder(Long id);
    
    /**
     * 取消订单
     * @param id 订单ID
     * @param reason 取消原因
     * @return 取消结果
     */
    AjaxResult cancelOrder(Long id, String reason);
    
    /**
     * 删除订单
     * @param id 订单ID
     * @return 删除结果
     */
    AjaxResult deleteOrder(Long id);
    
    /**
     * 批量删除订单
     * @param ids 订单ID字符串，多个ID用逗号分隔
     * @return 删除结果
     */
    AjaxResult deleteOrders(String ids);
    
    /**
     * 添加订单项
     * @param orderId 订单ID
     * @param request 订单项请求
     * @return 添加结果
     */
    AjaxResult addOrderItem(Long orderId, CreateOrderRequest.OrderItemRequest request);
    
    /**
     * 更新订单项支付状态
     * @param itemId 订单项ID
     * @param payStatus 支付状态
     * @param payType 支付方式
     * @return 更新结果
     */
    AjaxResult updateOrderItemPayStatus(Long itemId, Integer payStatus, Integer payType);
    
    /**
     * 生成订单编号
     * @return 订单编号
     */
    String generateOrderNo();
}